#include <iostream>

template <int N>
struct Factorial 
{
    enum { value = N * Factorial<N - 1>::value };
};
 
template <>
struct Factorial<0> 
{
    enum { value = 1 };
};
 
// Factorial<4>::value == 24
// Factorial<0>::value == 1
int foo()
{
    return Factorial<4>::value; // == 24
}

int main()
{
 std::cout << foo();
}
